//
//  ViewController.m
//  11-一次性执行
//
//  Created by apple on 16/1/5.
//  Copyright © 2016年 apple. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    for (int i = 0; i < 10; i ++) {
        
        Singleton *indtance = [Singleton shareInstance];
         NSLog(@"indtance = %@",indtance);
        
    };
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [self onceDemo2];
}

/// 验证一次性执行是线程安全的
- (void)onceDemo2
{
    // 获取全局并发队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    
    for (int i = 0; i < 100; ++i) {
        
        NSLog(@"%d",i);
        
        dispatch_async(queue, ^{
            
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                NSLog(@"hello");
            });
            
        });
    }
}

/// 一次性执行
- (void)onceDemo1
{
    NSLog(@"我点了");
    
    static dispatch_once_t onceToken;
    
    // 保存在静态区的onceToken有一个初始值,为0.第一次执行代码的时候,会通过地址去检测onceToken是否是初始值0.如果是,就执行一次性执行的代码.执行完成之后将onceToken的初始值修改为非0的值.当再一次执行的时候,如果获取的初始值不为0,就不执行代码.
    NSLog(@"返回值 %ld",onceToken);
    
    dispatch_once(&onceToken, ^{
        NSLog(@"hello");
    });
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
